package com.ceair.feignController;

import com.ceair.entity.Oauth2BasicUser;
import com.ceair.entity.SysRole;
import com.ceair.entity.result.Result;
import com.ceair.entity.vo.Oauth2BasicUserVO;
import com.ceair.entity.vo.SysRoleVO;
import com.ceair.service.IOauth2BasicUserService;
import com.ceair.service.ISysRoleService;
import com.ceair.utils.structMapper.Oauth2BasicUserStructMapper;
import com.ceair.utils.structMapper.SysRoleStructMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author wangbaohai
 * @ClassName Oauth2BasicUserFeignController
 * @description: 用户管理相关feign接口
 * @date 2025年04月27日
 * @version: 1.0.0
 */
@RestController
@RequestMapping("/systemClient/api/v1/user")
@RequiredArgsConstructor
@Slf4j
public class Oauth2BasicUserFeignController {

    private final IOauth2BasicUserService oauth2BasicUserService;
    private final ISysRoleService sysRoleService;

    /**
     * 查询所有用户的接口
     * 该方法通过POST请求查询系统中所有未删除的用户信息，并以列表形式返回
     * 使用了Oauth2BasicUserStructMapper来转换用户实体类到API视图对象
     *
     * @return 返回一个Result对象，其中包含用户信息列表如果查询失败，返回错误信息
     */
    @PostMapping("/queryAllUsers")
    public Result<List<Oauth2BasicUserVO>> queryAllUsers() {
        try {
            // 查询所有未删除的用户信息
            List<Oauth2BasicUser> oauth2BasicUsers = oauth2BasicUserService.lambdaQuery()
                    .eq(Oauth2BasicUser::getDeleted, false).list();

            // 使用 Oauth2BasicUserStructMapper 转换输出结果
            List<Oauth2BasicUserVO> oauth2BasicUserVOS =
                    oauth2BasicUsers.stream().map(Oauth2BasicUserStructMapper.INSTANCE::toApiVO).toList();

            // 返回成功结果
            return Result.success(oauth2BasicUserVOS);
        } catch (Exception e) {
            // 记录错误日志并返回错误结果
            log.error("查询所有用户失败，失败原因：{}", e.getMessage(), e);
            return Result.error("查询所有用户失败，失败原因：" + e.getMessage());
        }
    }

    /**
     * 处理查询所有角色的POST请求
     * <p>
     * 该方法通过调用sysRoleService查询所有未删除的角色信息，并使用SysRoleStructMapper将查询结果转换为API输出格式
     * 如果查询过程中发生异常，将记录错误日志并返回错误结果
     *
     * @return 返回一个Result对象，其中包含查询到的角色列表如果查询失败，返回错误信息
     */
    @PostMapping("/queryAllRoles")
    public Result<List<SysRoleVO>> queryAllRoles() {
        try {
            // 查询所有未删除的角色信息
            List<SysRole> sysRoles = sysRoleService.lambdaQuery().eq(SysRole::getDeleted, false).list();

            // 使用 SysRoleStructMapper 转换输出结果
            List<SysRoleVO> sysRoleVOS =
                    sysRoles.stream().map(SysRoleStructMapper.INSTANCE::toApiVO).toList();

            // 返回成功结果
            return Result.success(sysRoleVOS);
        } catch (Exception e) {
            // 记录错误日志并返回错误结果
            log.error("查询所有角色失败，失败原因：{}", e.getMessage(), e);
            return Result.error("查询所有角色失败，失败原因：" + e.getMessage());
        }
    }

    /**
     * 根据用户ID查询角色ID列表
     *
     * @param userId 用户ID，可选参数，如果未提供，则默认为null
     * @return 返回一个Result对象，其中包含角色ID列表
     */
    @PostMapping("/queryRoleIdsByUserId")
    public Result<List<Long>> queryRoleIdsByUserId(@RequestParam(required = false, name = "userId") Long userId) {
        try {
            // 查询所有未删除的角色信息
            List<Long> roleIds = sysRoleService.queryRoleIdsByUserId(userId);

            // 返回成功结果
            return Result.success(roleIds);
        } catch (Exception e) {
            // 记录错误日志并返回错误结果
            log.error("查询所有角色失败，失败原因：{}", e.getMessage(), e);
            return Result.error("查询所有角色失败，失败原因：" + e.getMessage());
        }
    }

    /**
     * 根据用户ID查询用户信息
     *
     * @param userId 用户ID，可选参数，用于指定要查询的用户
     * @return 返回一个Result对象，其中包含查询到的用户信息
     */
    @PostMapping("/queryUserById")
    public Result<Oauth2BasicUserVO> queryUserById(@RequestParam(required = false, name = "userId") Long userId) {
        try {
            // 查询所有未删除的角色信息
            Oauth2BasicUser oauth2BasicUser = oauth2BasicUserService.getById(userId);

            // 使用 Oauth2BasicUserStructMapper 转换输出结果
            Oauth2BasicUserVO oauth2BasicUserVO =
                    Oauth2BasicUserStructMapper.INSTANCE.toApiVO(oauth2BasicUser);

            return Result.success(oauth2BasicUserVO);
        } catch (Exception e) {
            // 记录错误日志并返回错误结果
            log.error("根据用户ID查询用户信息失败，失败原因：{}", e.getMessage(), e);
            return Result.error("根据用户ID查询用户信息失败，失败原因：" + e.getMessage());
        }
    }

}
